package com.lvyq.myplayer.common.util

import android.content.Context
import android.os.Environment
import android.os.StatFs
import android.util.Log
import java.io.File
/**
 * 文件描述：StorageUtils
 * 作者：lvyq
 * 创建时间：2025-06-11
 * 修改时间：2025-06-11
 */


object StorageUtils {

    private const val TAG = "StorageUtils"



    /**
     * 获取应用内部存储目录（无需权限）
     * 路径：/data/data/<package_name>/
     * 用途：存储应用私有文件，其他应用无法访问
     */
    fun getInternalStorageDir(context: Context): File {
        return context.filesDir
    }

    /**
     * 获取应用内部缓存目录（无需权限）
     * 路径：/data/data/<package_name>/cache/
     * 用途：存储临时缓存文件，系统会在内存不足时自动清除
     */
    fun getInternalCacheDir(context: Context): File {
        return context.cacheDir
    }

    /**
     * 获取外部存储目录（需要权限）
     * 路径：/storage/emulated/0/ 或 /sdcard/
     * 用途：存储公共文件，所有应用都可访问
     * 需要权限：READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE（Android 10以下）
     */
    fun getExternalStorageDir(): File? {
        return if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
            Environment.getExternalStorageDirectory()
        } else {
            Log.w(TAG, "外部存储不可用")
            null
        }
    }

    /**
     * 获取应用外部存储目录（需要权限）
     * 路径：/storage/emulated/0/Android/data/<package_name>/files/
     * 用途：存储应用专属文件，卸载应用时会自动删除
     * 需要权限：READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE（Android 10以下）
     */
    fun getExternalFilesDir(context: Context, type: String? = null): File? {
        return context.getExternalFilesDir(type)
    }

    /**
     * 获取应用外部缓存目录（需要权限）
     * 路径：/storage/emulated/0/Android/data/<package_name>/cache/
     * 用途：存储临时缓存文件，卸载应用时会自动删除
     * 需要权限：READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE（Android 10以下）
     */
    fun getExternalCacheDir(context: Context): File? {
        return context.externalCacheDir
    }

    /**
     * 获取外部存储的下载目录（需要权限）
     * 路径：/storage/emulated/0/Download/
     * 用途：存储用户下载的文件
     * 需要权限：READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE（Android 10以下）
     */
    fun getDownloadsDir(context: Context): File? {
        return if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
            Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
        } else {
            Log.w(TAG, "外部存储不可用")
            null
        }
    }

    /**
     * 检查外部存储是否可用
     */
    fun isExternalStorageAvailable(): Boolean {
        return Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED
    }

    /**
     * 获取存储空间信息
     * @param path 存储路径
     * @return Pair<可用空间, 总空间> 单位：字节
     */
    fun getStorageSpace(path: File): Pair<Long, Long> {
        val statFs = StatFs(path.path)
        val blockSize = statFs.blockSizeLong
        val availableBlocks = statFs.availableBlocksLong
        val totalBlocks = statFs.blockCountLong

        val availableSpace = availableBlocks * blockSize
        val totalSpace = totalBlocks * blockSize

        return Pair(availableSpace, totalSpace)
    }
}